package com.gxa.employment.controller;

import com.gxa.employment.common.Result;
import com.gxa.employment.entity.dto.ReallocatePermDto;
import com.gxa.employment.entity.pojo.Role;
import com.gxa.employment.exception.BizException;
import com.gxa.employment.exception.ErrorMessage;
import com.gxa.employment.mapper.RoleMapper;
import com.gxa.employment.service.RoleService;


import org.apache.ibatis.annotations.Delete;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;

/**
 * <p>
 * 系统角色表 前端控制器
 * </p>
 *
 * @author author
 * @since 2025-03-25
 */
@RestController
@RequestMapping("/role")
@Tag(name = "角色管理", description = "角色相关操作API")
public class RoleController {
    @Autowired
    RedisTemplate<String, Object> redisTemplate;
    @Autowired
    private RoleService roleService;
    @Autowired
    private RoleMapper roleMapper;

    @PostMapping("/add")
    @Operation(summary = "添加角色")
    public Result add(@RequestBody Role role) {
        roleService.save(role);
        return Result.success();
    }

    @PutMapping("/update")
    @Operation(summary = "修改角色")
    public Result update(@RequestBody Role role) {
        roleService.updateById(role);
        //删除缓存
        redisTemplate.delete("role:"+role.getRoleId());
        return Result.success();
    }

    @DeleteMapping("/delete")
    @Operation(summary = "删除角色")
    @Transactional(rollbackFor = Throwable.class)  //事务
    public Result delete(@RequestParam Integer id) throws BizException {
        if(id==1){
            throw new BizException(ErrorMessage.NO_PERMISSION);
        }
        roleService.removeById(id);
        //删除该角色的所有权限
        roleMapper.deleteAll(id);
        //删除缓存
        redisTemplate.delete("role:"+id);
        return Result.success();
    }


    /**
     * 重新分配菜单
     *
     * @param dto 包含重新分配菜单所需的参数，如角色ID和菜单ID等
     * @return 分配结果，成功时返回分配后的结果，失败时返回错误信息
     */
    @PostMapping("/reallocatePerm")
    @Operation(summary = "重新分配菜单")
    @Transactional(rollbackFor = Throwable.class)  //事务
    public Result reallocatePerm(@RequestBody ReallocatePermDto dto) throws BizException {
        roleService.reallocatePerm(dto);
        //删除缓存
        redisTemplate.delete("role:"+dto.getRoleId());
        return Result.success();
    }

    /**
     * 获取所有角色列表及其权限信息
     * 调用此方法将返回系统中所有角色的列表数据
     *
     * @return 返回包含所有角色列表的Result对象
     */
    @GetMapping("/getAllList")
    @Operation(summary = "获取所有角色列表")
    public Result getAllList() {
        //这个是包括了所有权限信息的4个列表
        return Result.success(roleService.getAllList());
    }

    /**
     * 获取所有角色列表
     * 该接口用于获取系统中所有角色的列表数据
     *
     * @return 返回包含所有角色列表的Result对象
     */
    @GetMapping("/list")
    @Operation(summary = "获取所有角色列表")
    public Result<List<Role>> list() {
        return Result.success(roleService.list());
    }

    /**
     * 根据角色ID和类型获取角色信息
     * 该接口通过角色ID和类型查询并返回相应的角色信息
     *
     * @param roleId 角色ID，用于唯一标识一个角色
     * @param type   类型，用于指定查询的角色类型
     * @return 返回包含角色信息的Result对象
     */
    @GetMapping("/getByRole")
    @Operation(summary = "根据角色ID和类型获取角色信息")
    public Result getByRole(@RequestParam("roleId") Integer roleId, @RequestParam("type") String type) {
        return Result.success(roleService.getByRole(roleId,type));
    }
}
